package com.cskaoyan.javase.oop1._4compare;
/**
 * 局部变量和成员变量的比较，我们从以下五个方面去比较：
 * 1.在类中定义的位置不同
 *      局部变量: 定义在局部位置，被大括号限制作用域
 *      成员变量: 定义在成员位置
 *
 * 2.在内存中的位置不同
 *      局部变量: 存在栈上
 *      成员变量: 存在堆上的对象中
 *
 * 3.生命周期不同
 *      局部变量: 和方法调用同生共死,方法开始调用生效,方法执行完毕销毁失效
 *      成员变量: 和对象同生共死.当然如果对象成为垃圾,没有引用指向它
 *          那么成员变量实际上也就不可用了.
 *
 * 4.有无默认初始化不同/有没有默认值
 *      局部变量: 没有默认初始化,没有默认值,必须手动初始化,手动赋值
 *          然后才可用
 *      成员变量: 有默认初始化,有默认值,而且默认初始化在所有赋值手段中
 *          最先执行.
 *          对象中的元素具有默认值.
 *
 * 5.作用范围
 *      局部变量: 局部变量被大括号限制了作用域,仅在大括号内部生效.
 *      成员变量: 定义在类体中的成员位置,在整个类体中都生效(在整个类中都能够访问到它)
 *          从语法表现上来说:
 *          在类中的成员方法中,可以直接访问同类下的成员变量
 *          而在类中的非成员方法(static修饰的方法)中,不可以直接访问同类下的成员变量
 *              但是可以间接访问
 *              new对象,new完对象后,用对象名点访问
 *
 *
 * @since 10:17
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    // 成员变量
    int num = 10;
    public static void main(String[] args) {
        // 局部变量
        int num = 10;
    }
    public void test(){
        int num = 10;
    }
}
class Student{
    int age;
    String name;

    // 成员方法
    public void test(){
        System.out.println(age);
        System.out.println(name);
    }

    // 非成员方法
    public static void testStatic(){
        // System.out.println(age);
        // System.out.println(name);
        Student s = new Student();
        System.out.println(s.age);
    }
}